package Problemas;

import Busquedas.Estado;
/**
 * Clase de la que heredan todas los problemas implementados

 * PONER LOS COMENTARIOS A TODAS LAS CLASES
 */
public abstract class Problema {
	
    private int numParametrosEstado;	
	private int numOper;	
	private int [] CosteOper;	
	private String [] NombreOper;
    private Estado inicial;	
	private Estado[] objetivo;
        


	public void inicializa(Estado inicial,Estado[] objetivo,int numOper,String[] nombreOperadores,int[] CosteOper){
		this.setInicial(inicial);//Estado inicial
		this.setObjetivo(objetivo);//Estados objetivo/s
		this.setnumOper(numOper);//Numero de operadores 
		this.setNombreOper(nombreOperadores);//Nombre de los operadores a ejecutar
		this.setCosteOper(CosteOper); //Coste de los distintos operadores
	}
	
	
	public int getCosteOperador(int i) {
		return CosteOper[i];
	}


	public void setCosteOper(int[] CosteOper) {
		this.CosteOper = CosteOper;
	}

	public void setCosteOperador(int op,int coste) {
		this.CosteOper [op]= coste;
	}

	public Estado getInicial() {
		return inicial;
	}


	public void setInicial(Estado inicial) {
		this.inicial = inicial;
	}


	public int getNumParametrosEstado() {
		return numParametrosEstado;
	}


	public void setNumParametrosEstado(int numParametrosEstado) {
		this.numParametrosEstado = numParametrosEstado;
	}


	public Estado[] getObjetivo() {
		return objetivo;
	}


	public void setObjetivo(Estado[] objetivo) {
		this.objetivo = objetivo;
	}
        
        public String getNombreOperador(int i) {
		return NombreOper[i];
	}


	public void setNombreOper(String[] NombreOper) {
		this.NombreOper = NombreOper;
	}

	public int getnumOper() {
		return numOper;
	}


	public void setnumOper(int numOper) {
		this.numOper = numOper;
	}
	
	/*
         * Función que devuelve true si estamos en un estado obejtivo
	 */
	
        
        
   public boolean estadoFinal(Estado actual){
		boolean encontrado = false;
		int i = 0;
		while (i < objetivo.length && !encontrado){
			encontrado = actual.esIgual(objetivo[i]);
			i++;
		}
		return encontrado;
	}
	
	
	/*
	 Aplica al estado el numero de operador que corresponde
	 */
   public abstract Estado aplicaOperador(Estado actual,int i);




	
	public void setNombreOperador(String nombreOperador,int i) {
		this.NombreOper[i] = nombreOperador;
	}
	
	/*
	 * Función que calcula el coste heurístico de un estado
	 */
	public abstract int funcionHeuristica(Estado estado);
    /*{
		return 0;
	}*/


	public abstract int getOperadorInverso(int op);

    public String getSoluciones(){return "";}
    
    public boolean resuelveProblema(int a, int b, int c,int d){return true;}
    
    public int inicial(){return 0;}

    public void escribe(int c, int a,int b){}
	
	

}
